﻿using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Threading;

namespace 凯蒽斯.page
{
    /// <summary>
    /// AxisMonitoringControl1.xaml 的交互逻辑
    /// </summary>
    public partial class AxisMonitoringControl1 : UserControl
    {
        private string[] textBlockNames = new string[512];
        private readonly DispatcherTimer _timer = new DispatcherTimer();
        public AxisMonitoringControl1()
        {
            InitializeComponent();
            Generate256TextBlocks();
            Generate256TextBlocksAlarm();
            this.Loaded += MainPage_Loaded; // 绑定加载事件
                                            // 配置定时器：间隔1秒（根据需求调整，如500ms）

            _timer.Interval = TimeSpan.FromSeconds(1);
            // 绑定定时器触发事件（循环读取的核心）
            _timer.Tick += async (s, e) => await Timer_TickAsync();
            _timer.Start();
        }

        private async Task Timer_TickAsync()
        {
            ///回零完成
            if (MainWindow.valuePairs.TryGetValue("plc时间", out object timeValue))
            {
                // 假设源数组是Int64[]（根据实际类型调整，如int[]、long[]等）
                Int64[] sourceArray = timeValue as Int64[];
                if (sourceArray != null)
                {
                    // 将源数组转换为ushort数组
                    ushort[] timeArray = Array.ConvertAll(sourceArray, item => (ushort)item);
                    // 计算总bit数（每个ushort占16位）
                    int totalBits = timeArray.Length * 16;
                    // 创建bit数组（true=1，false=0）
                    bool[] bitArray = new bool[totalBits];

                    // 遍历每个ushort元素，提取16位bit（从高位到低位）
                    for (int i = 0; i < timeArray.Length; i++)
                    {
                        ushort value = timeArray[i];
                        for (int bitPos = 0; bitPos < 16; bitPos++)
                        {
                            int index = i * 16 + bitPos;
                            // 提取第(15 - bitPos)位（与二进制字符串顺序一致）
                            bool isSet = ((value >> (15 - bitPos)) & 1) == 1;
                            bitArray[index] = isSet;
                        }
                    }

                    // 遍历256个TextBlock控件，根据bitArray设置样式
                    for (int i = 0; i < 256; i++)
                    {
                        // 查找对应的TextBlock
                        if (this.FindName($"txtAlarm{i}") is TextBlock txt)
                        {
                            // 安全获取当前bit值（超出bitArray长度时默认0）
                            bool isBitSet = (i < bitArray.Length) ? bitArray[i] : false;

                            // 根据bit值设置背景色（1→红色，0→绿色）
                            txt.Background = isBitSet ? Brushes.Red : Brushes.Green;

                        }
                    }

                }
                ///回零完成
                if (MainWindow.valuePairs.TryGetValue("plc时间", out object Value))
                {
                    // 假设源数组是Int64[]（根据实际类型调整，如int[]、long[]等）
                    Int64[] source = timeValue as Int64[];
                    if (sourceArray != null)
                    {
                        // 将源数组转换为ushort数组
                        ushort[] timeArray = Array.ConvertAll(source, item => (ushort)item);
                        // 计算总bit数（每个ushort占16位）
                        int totalBits = timeArray.Length * 16;
                        // 创建bit数组（true=1，false=0）
                        bool[] bitArray = new bool[totalBits];

                        // 遍历每个ushort元素，提取16位bit（从高位到低位）
                        for (int i = 0; i < timeArray.Length; i++)
                        {
                            ushort value = timeArray[i];
                            for (int bitPos = 0; bitPos < 16; bitPos++)
                            {
                                int index = i * 16 + bitPos;
                                // 提取第(15 - bitPos)位（与二进制字符串顺序一致）
                                bool isSet = ((value >> (15 - bitPos)) & 1) == 1;
                                bitArray[index] = isSet;
                            }
                        }

                        // 遍历256个TextBlock控件，根据bitArray设置样式
                        for (int i = 0; i < 256; i++)
                        {
                            // 查找对应的TextBlock
                            if (this.FindName($"txt{i}") is TextBlock txt)
                            {
                                // 安全获取当前bit值（超出bitArray长度时默认0）
                                bool isBitSet = (i < bitArray.Length) ? bitArray[i] : false;

                                // 根据bit值设置背景色（1→红色，0→绿色）
                                txt.Background = isBitSet ? Brushes.Red : Brushes.Green;
                            }
                        }

                    }
                    if (MainWindow.valuePairs.TryGetValue("plc时间", out object TimeValue))
                    {
                        // 假设源数组是Int64[]（根据实际类型调整，如int[]、long[]等）
                        Int64[] Source = TimeValue as Int64[];
                        if (sourceArray != null)
                        {
                            string[] hexArray = source
                            .Select(item => item.ToString("X16")) // 固定16位，不足补前导零
                            .ToArray();
                            // 合并所有16进制字符为一个连续数组（如2个16位元素→32个字符）
                            char[] allHexChars = string.Concat(hexArray).ToCharArray();

                            // 遍历256个控件
                            for (int i = 0; i < 256; i++)
                            {
                                if (this.FindName($"txtAlarmBug{i}") is TextBlock txt)
                                {
                                    int row = i / 12;
                                    int col = i % 12;

                                    if (col != 0 && col != 11) // 中间列
                                    {
                                        // 显示单个16进制字符（超出范围显示0）
                                        txt.Text = i < allHexChars.Length ? "Er"+allHexChars[i].ToString() : "Er0";
                                    }
                                }
                            }

                        }
                    }
                }
            }
        }



        // 生成256个带唯一Name的TextBlock
        /// <summary>
        /// 故障
        /// </summary>
        private void Generate256TextBlocks()
        {
            for (int i = 0; i < 256; i++)
            {
                // 1. 创建边框控件（用于设置边框，替代TextBlock的Border属性）
                Border border = new Border();
                border.Width = 30;
                border.Height = 30;
                border.Margin = new Thickness(1); // 边框之间的间隔
                border.BorderBrush = Brushes.Gray; // 边框颜色（Border控件的属性）
                border.BorderThickness = new Thickness(1); // 边框厚度

                // 2. 创建TextBlock（仅负责显示文本）
                TextBlock txt = new TextBlock();

                // 设置唯一Name（用于后续操作）
                string name = $"txt{i}";
                txt.Name = name;
                textBlockNames[i] = name;
                txt.Width = 30;
                txt.Height = 30;
                // 显示文本（1-256）
                txt.Text = (i + 1).ToString();

                // 关键：文本居中设置
                txt.TextAlignment = TextAlignment.Center; // 水平居中
                txt.VerticalAlignment = VerticalAlignment.Center; // 垂直居中
                txt.HorizontalAlignment = HorizontalAlignment.Center; // 确保在Border中水平居中
                txt.FontSize = 12;
                txt.Background = Brushes.White; // 文本块背景色

                // 3. 将TextBlock放入Border中（Border作为容器提供边框）
                border.Child = txt;

                // 4. 注册TextBlock的Name到窗口（方便后续通过Name查找）
                this.RegisterName(name, txt);

                // 5. 将带边框的TextBlock添加到容器
                textBlockContainer.Children.Add(border);
            }

        }
        /// <summary>
        /// 原点
        /// </summary>
        private void Generate256TextBlocksAlarm()
        {
            for (int i = 0; i < 256; i++)
            {
                // 1. 创建边框控件（用于设置边框，替代TextBlock的Border属性）
                Border border = new Border();
                border.Width = 30;
                border.Height = 30;
                border.Margin = new Thickness(1); // 边框之间的间隔
                border.BorderBrush = Brushes.Gray; // 边框颜色（Border控件的属性）
                border.BorderThickness = new Thickness(1); // 边框厚度

                // 2. 创建TextBlock（仅负责显示文本）
                TextBlock txt = new TextBlock();

                // 设置唯一Name（用于后续操作）
                string name = $"txtAlarm{i}";
                txt.Name = name;
                textBlockNames[i] = name;

                // 显示文本（1-256）
                txt.Text = (i + 1).ToString();
                txt.Width = 30;
                txt.Height = 30;
                // 关键：文本居中设置
                txt.TextAlignment = TextAlignment.Center; // 水平居中
                txt.VerticalAlignment = VerticalAlignment.Center; // 垂直居中
                txt.HorizontalAlignment = HorizontalAlignment.Center; // 确保在Border中水平居中
                txt.FontSize = 12;
                txt.Background = Brushes.White; // 文本块背景色

                // 3. 将TextBlock放入Border中（Border作为容器提供边框）
                border.Child = txt;

                // 4. 注册TextBlock的Name到窗口（方便后续通过Name查找）
                this.RegisterName(name, txt);

                // 5. 将带边框的TextBlock添加到容器
                textBlockAlarm.Children.Add(border);
            }
        }
        private void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            int totalCount = 312; // 总元素数
            for (int index = 0; index < totalCount; index++)
            {
                // 计算当前元素所在的行和列
                int row = index / 12; // 行索引（0-21）
                int col = index % 12; // 列索引（0-11）

                // 1. 创建边框控件（用于设置边框，替代TextBlock的Border属性）
                Border border = new Border();
                border.Width = 30;
                border.Height = 30;
                border.Margin = new Thickness(1); // 边框之间的间隔
                border.BorderBrush = Brushes.Gray; // 边框颜色（Border控件的属性）
                 // 边框厚度

                // 2. 创建TextBlock（仅负责显示文本）
                TextBlock txt = new TextBlock();

                // 设置唯一Name（用于后续操作）
                string name = $"txtAlarmBug{index}";
                txt.Name = name;
                textBlockNames[index] = name;


                // 关键：文本居中设置
                txt.TextAlignment = TextAlignment.Center; // 水平居中
                txt.VerticalAlignment = VerticalAlignment.Center; // 垂直居中
                txt.HorizontalAlignment = HorizontalAlignment.Center; // 确保在Border中水平居中
                txt.FontSize = 12;
                txt.Width = 30;
                txt.Height = 30;
                // 3. 将TextBlock放入Border中（Border作为容器提供边框）
                border.Child = txt;

                // 4. 注册TextBlock的Name到窗口（方便后续通过Name查找）
                this.RegisterName(name, txt);

                

                // 最左列（第0列）：1,11,21,...
                if (col == 0)
                {
                    txt.Text = (1 + 10 * row).ToString();
                }
                // 最右列（第11列）：10,20,30,...（仅前21行有此列，第22行不足12列）
                else if (col == 11)
                {
                    txt.Text = (10 + 10 * row).ToString();
                }
                // 中间列（1-10列）：留空或填充其他内容
                else
                {
                    border.BorderThickness = new Thickness(1);
                }

                textAxiaBug.Children.Add(border);
            }
        }
    }
    
}

